package com.token.sysflow.core;
import com.token.sql.IntegrateSql;
import com.token.sysflow.enumerate.ApprovalTypeEnum;
import com.token.sysflow.enumerate.FlowStatusEnum;
import com.token.sysflow.exception.ErrorCodeEnum;
import com.token.sysflow.exception.FlowException;
import com.token.sysflow.impl.AbstractFlowHandlerImpl;

/**
 * 作废流程：只有申请人有权限作废流程。
 * @author chenjianxiong 2020/4/13
 */
public class OverFlow extends AbstractFlowCore{
    public OverFlow(IntegrateSql f, String keyUnid) throws Exception{
        super(f,keyUnid);
    }


    @Override
    public void execute(AbstractFlowHandlerImpl flowHandler) throws Exception{

        if(approveProcess.getApprovalType() != ApprovalTypeEnum.SP.getId()){
            throw new FlowException(ErrorCodeEnum.OVER_CONFIG_NO);
        }

        //判断当前用户是否是当前流程的申请人
        if(!approveProcess.getCreater().equals(flowHandler.getActionUser())){
            throw new FlowException(ErrorCodeEnum.OVER_CHECK_APPROVE);
        }

        //初始化起草人、申请人、当前人。
        initUserInfo(approveProcess.getCreater(),approveProcess.getApplyer(),flowHandler.getActionUser());

        //判断开关
        if(!getFromStep().isCanOther()){
            throw new FlowException(ErrorCodeEnum.CONFIG_OVER);
        }

        //设置目标流程。
        this.setToFlow(this.getFromFlow());

        //设置目标环节。
        this.setToStep(this.getFromStep());

        //更新审批数据
        super.updateApproveProcess(flowHandler, FlowStatusEnum.STOP);

        //生成新的流转记录和办理意见
        super.createFlowApproveLog(flowHandler);

        //迁移数据到审批完成
        approveProcess.insertToEnd();

        //处理知会
        this.handleSystemNotify("流程作废","单据【"+ approveProcess.getFlowNo() +"】有用户操作了“作废”，原因是："+ flowHandler.getOpinions() +"。",flowRecord.getFlowRecordApprovers());
    }
}
